package data.nanjing.expo.models.dao;

import data.nanjing.expo.models.domain.FileManage;
import data.nanjing.expo.models.domain.dto.exhibition.*;
import data.nanjing.expo.models.domain.exhibition.*;
import org.apache.ibatis.annotations.Param;
import org.omg.CORBA.INTERNAL;
import org.springframework.stereotype.Component;

import javax.annotation.Priority;
import javax.validation.Valid;
import java.net.InetAddress;
import java.util.Date;
import java.util.List;

/**
 * 展览中心
 *
 * @author ChanJi
 * @create 2018-06-19 8:38
 **/
@Component
public interface ExhibitionDao {

    /**
     * 获取展会的列表，按照权重、时间降序排列
     * @return
     */
    List<Exhibition> getExhibitionList(@Param("offset") Integer offset, @Param("limit") Integer limit);

    /**
     * 获得展会详情的基本信息
     * @param id
     * @return
     */
    ExhibitionDto getDetail(@Param("id") Integer id);

    /**
     *根据展会id获取其下的活动
     * @param id
     * @return
     */
    List<ExhibitionActivity> getActivity(@Param("id") Integer id);

    /**
     * 根据展会id获取历史展会
     * @param id
     * @return
     */
    List<ExhibitionHistory> getHisExhibition(@Param("id") Integer id);

    /**
     * 根据展会id获取展馆
     * @param id
     * @return
     */
    List<ExhibitionHall> getExhibitionHall(@Param("id") Integer id);

    /**
     * 根据展会id获取所有展区
     * @param id
     * @return
     */
    List<ExhibitionArea> getExhibitionArea(@Param("id") Integer id);

    /**
     * 通过展馆id获取第一个展区
     * @param id
     * @return
     */
    Integer getExhibitionAreaByHallId(@Param("id") Integer id);

    /**
     * 通过展会id获取第一个展馆
     * @param id
     * @return
     */
    Integer getExhibitionHallById(@Param("id") Integer id);

    /**
     * 查询展馆下的展位和公司信息
     * @return
     */
    List<ParticipantDto> getParticipantDto(@Param("hallId") Integer hallId,
                                           @Param("areaId") Integer areaId,
                                           @Param("offset") Integer offset,
                                           @Param("limit") Integer limit);


    /**
     * 通过参展商详情获取参展商信息
     * @param id
     * @return
     */
    List<ParticipantDetailDto> getExpoParticipant(@Param("id") Integer id);


    /**
     * 上传展会基本信息
     * @param expo
     */
    Integer insertExhibition(UploadExpoDto expo);

    /**
     * 通过展会名称获得展会id
     * @param name
     * @return
     */
    Integer getExpoIdByName(@Param("name") String name);

    /**
     * 插入展会详细信息
     * @param expo
     */
    void insertExhibitionDetail(UploadExpoDto expo);

    /**
     * 获得展馆的所有颜色
     * @return
     */
    List<String> getHallColors();

    /**
     * 添加展馆信息
     * @param hall
     */
    void insertExhibitionHall(HallDto hall);

    /**
     * 通过展会id和展馆的名字获得展馆的id
     * @param hallName
     * @param expoId
     * @return
     */
    Integer getHallId(@Param("expoId") Integer expoId,
                      @Param("hallName") String hallName);

    /**
     * 插入展区信息
     * @param area
     */
    void insertExhibitionArea(AreaDto area);

    /**
     * 获得展区id
     * @param hallId
     * @param areaName
     * @return
     */
    Integer getAreaId(@Param("hallId") Integer hallId,
                      @Param("areaName") String areaName);

    /**
     * 插入展位信息
     * @param stand
     */
    void insertExhibitionStand(StandDto stand);

    /**
     * 上传历史展会信息
     * @param expoId
     * @param hisExpoName
     * @param hisExpoUrl
     * @param hisExpoId
     * @param createTime
     * @param updateTime
     */
    void insertExhibitionHistory(@Param("expoId") Integer expoId,
                                 @Param("hisExpoName") String hisExpoName,
                                 @Param("hisExpoUrl") String hisExpoUrl,
                                 @Param("hisExpoId") Integer hisExpoId,
                                 @Param("createTime") Date createTime,
                                 @Param("updateTime") Date updateTime);

    /**
     * 上传展会活动
     * @param expoId
     * @param activityName
     * @param activityUrl
     * @param createTime
     * @param updateTime
     */
    void insertExhibitionActivity(@Param("expoId") Integer expoId,
                                  @Param("activityName") String activityName,
                                  @Param("activityUrl") String activityUrl,
                                  @Param("activityId") Integer activityId,
                                  @Param("createTime") Date createTime,
                                  @Param("updateTime") Date updateTime);

    /**
     * 根据用户id获得指定状态的展会
     * @param userId
     * @return
     */
    List<ExpoOfUser> findExpoList(@Param("userId") Integer userId);
    /**
     * 根据用户id和展会id查询展会是否存在
     * @param expoId
     * @param userId
     * @return
     */
    Integer findExpo(@Param("expoId") Integer expoId,
                     @Param("userId") Integer userId);

    /**
     * 用户取消展会
     * @param expoId
     */
    void userCancelExpo(@Param("expoId") Integer expoId);
    /**
     * 获得展会下的验证码
     * @param expoId
     * @return
     */
    List<String> getVerifyCode(@Param("expoId") Integer expoId);

    /**
     * 通过展会id和验证码查询记录是否存在
     * @param verifyCode
     * @return
     */
    Integer verifyParticipantLogin(@Param("verifyCode") String verifyCode);

    /**
     * 将使用验证码用户id存入数据库，并改变验证码使用状态
     * @param userId
     * @param standId
     */
    void updateVerifyCodeState(@Param("userId") Integer userId,
                               @Param("standId") Integer standId);

    /**
     * 插入参展商基本信息
     * @param participants
     * @return Integer
     */
    Integer insertParticipant(@Param("participants") Participants participants);

    /**
     * 插入参展商信息信息
     * @param participantDetail
     */
    void insertParticipantDetail(@Param("participantDetail") ParticipantDetail participantDetail);



    /**
     * 通过展位的id获得展会的id和名称
     * @param standId
     * @return
     */
    ExpoOfUser findExpoByStandId(@Param("standId") Integer standId);

    /**
     * 根据展会id获取所有展馆名称和id
     * @param expoId
     * @return
     */
    List<HallDto> getHallByExpoId(@Param("expoId") Integer expoId);

    /**
     * 通过展馆id获取展区名称和id
     * @param hallId
     * @return
     */
    List<AreaDto> getAreaByHallId(@Param("hallId") Integer hallId);

    /**
     * 通过展区id获得展位信息
     * @param areaId
     * @return
     */
    List<StandDto> getStandByAreaId(@Param("areaId") Integer areaId);

    /**
     * 查看展位是否已经入驻
     * @param standId
     * @return
     */
    Integer getParticipantIdByStandId(@Param("standId") Integer standId);


    /**
     * 上传参展商文件
     * @param userId
     * @param participantId
     * @param key
     * @param fileName
     * @param fileType
     * @param belong
     */
    void saveParticipantFile(@Param("userId") Integer userId,
                             @Param("participantId") Integer participantId,
                             @Param("key") String key,
                             @Param("fileName") String fileName,
                             @Param("fileType") String fileType,
                             @Param("belong") String belong);

    /**
     * 验证同一展会是否只有一个参展商
     * @param expoId
     * @param userId
     * @return
     */
    Integer verifyParticipant(@Param("expoId") Integer expoId,
                              @Param("userId") Integer userId);

    /**
     * 统计展馆下的参展商个数
     * @param hallId
     * @return
     */
    Integer findParticipantByHallId(@Param("hallId") Integer hallId);

    /**
     * 根据展馆id分页获取参展商信息
     * @param hallId
     * @param offset
     * @param limit
     * @return
     */
    List<Participants> getParticipantList(@Param("hallId") Integer hallId,
                                          @Param("offset") Integer offset,
                                          @Param("limit") Integer limit);

    /**
     * 通过用户id查询是否已经登陆过
     * @param userId
     * @return
     */
    Integer getIdByUserId(@Param("userId") Integer userId);

    /**
     * 主办方修改参展商展位
     * @param m
     */
    void modifyParticipantStandByManager(@Param("m") ModifyStandInfoDto m);

    /**
     * 根据展会id查询用户id
     * @param expoId
     * @return
     */
    Integer verifyExpoByIdAndUserId(@Param("expoId") Integer expoId);


    /**
     * 修改展会基本信息
     * @param u
     * @param startTime
     * @param endTime
     */
    void updateExpo(@Param("u") UploadExpoDto u,
                    @Param("startTime")Date startTime,
                    @Param("endTime")Date endTime);

    /**
     * 取消参展商
     * @param participantId
     */
    void cancelParticipant(@Param("participantId") Integer participantId);

    /**
     * 通过展会的id获取展区的id和名称
     * @param expoId
     * @return
     */
    List<AreaDto> getAreaDtoByExpoId(@Param("expoId") Integer expoId);

    /**
     * 根据展会id,对展位编号
     * @param expoId
     * @return
     */
    List<StandDto> getStandDto(@Param("expoId") Integer expoId);

    /**
     * 删除所有历史展会
     * @param expoId
     */
    void delHisExpoByExpoId(Integer expoId);

    /**
     * 删除展会下的所有活动
     * @param expoId
     */
    void delExpoActivity(Integer expoId);

    /**
     * 根据展会id获取展会的验证码，使用验证码的用户id信息
     * @param expoId
     * @return
     */
    List<Stand> getStandInfo(Integer expoId);

    /**
     * 插入展位信息,修改展位时用
     * @param stand
     */
    void insertStandByUpdate(@Param("stand") Stand stand);

    /**
     * 删除所有展馆、区、位
     * @param expoId
     */
    void delStands(Integer expoId);

    /**
     * 获取已经登陆的参展商个数
     * @param expoId
     * @return
     */
    Integer getParticipantNumber(Integer expoId);

    /**
     * 获得参展商详情
     * @param participantId
     * @return
     */
    ParticipantDetailDto getParticipantDetail(@Param("participantId") Integer participantId);

    /**
     *  获得用户的参展商信息列表
     * @param userId
     * @param status
     * @return
     */
    List<ParticipantListDto> getParticipantListByUserId(@Param("userId") Integer userId,
                                                        @Param("status") String status);

    /**
     * 参展商自己修改信息
     * @param Participant
     */
    void modifyParticipant(@Param("participant") ParticipantDetailDto Participant);

    /**
     * 删除参展商文件
     * @param fileId
     */
    void delParticipantFile(Integer fileId);

    /**
     * 通过文件的id获取用户的id
     * @param fileId
     * @return
     */
    Integer findUserIdByFileId(Integer fileId);

    /**
     * 返回参展商文件
     * @param participantId
     * @return
     */
    List<FileManage> getParticipantFile(Integer participantId);

    /**
     * 获取展馆id、展位的编号名称和参展商的id
     * @param expoId
     * @return
     */
    List<Stand> getParticipantStand(Integer expoId);

    /**
     * 更新展馆名称
     * @param hallName
     * @param updateTime
     * @param hallId
     */
    void updateHallName(@Param("hallName") String hallName,
                        @Param("updateTime") Date updateTime,
                        @Param("hallId") Integer hallId);

    /**
     * 删除展会展馆
     * @param expoId
     * @param hallId
     */
    void delHall(@Param("expoId") Integer expoId,
                 @Param("hallId") Integer hallId);

    /**
     * 将参展商的信息更新到展位中
     * @param hallId
     * @param areaName
     * @param standWord
     * @param standNumber
     * @param s
     */
    void insertParticipantToStand(Integer hallId, String areaName, String standWord, Integer standNumber, String s);

    Exhibition findExpoById(@Param("id") Integer id);

    List<StandDto> getAllStandByExpoId(@Param("expoId") Integer expoId);

    void updateExhibitionHall(HallDto hall);
}
